home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume24 / sysVr4386slip / part01 next >
Encoding:
Internet Message Format  |  1991-03-21  |  52.3 KB

  1. Subject:  v24i078:  SystemVr4/386 SLIP driver and utilities, Part01/04
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: e28a84ba 973ccfe3 1400dc68 5d4e27b6
  5.  
  6. Submitted-by: sudji@indo.intel.com (Sudji Husodo)
  7. Posting-number: Volume 24, Issue 78
  8. Archive-name: sysVr4386slip/part01
  9.  
  10. [ I repacked this, but have not tested it.  It might run on other SysVr4
  11.   systems without too many changes.  --r$ ]
  12.  
  13. This package contains a SLIP driver and related utilities for Unix System
  14. V/386 Release 4.0.  SLIP is a protocol that lets you run the IP (and
  15. related) network protocols over a standard serial line.
  16.  
  17. The utility programs include:
  18.     +slattach, to link the SLIP streams driver to the serial port, and the
  19.      IP driver to the SLIP driver.
  20.     +slhangup and slhangupd, to process hangup messages.
  21.     +dialslip, to allow hosts to dial in and start SLIP sessions.
  22.  
  23. #! /bin/sh
  24. # This is a shell archive.  Remove anything before this line, then feed it
  25. # into a shell via "sh file" or similar.  To overwrite existing files,
  26. # type "sh file -c".
  27. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  28. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  29. # Contents:  PACKNOTES README MANIFEST dialslip driver driver/ID
  30. #   driver/io driver/io/slip.c driver/sys driver/v2.ip.fix
  31. #   driver/v2.ip.fix/Driver.UU.02 man man/man1 man/man7 utils
  32. # Wrapped by rsalz@litchi.bbn.com on Fri Mar 22 11:57:10 1991
  33. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  34. echo If this archive is complete, you will see the following message:
  35. echo '          "shar: End of archive 1 (of 4)."'
  36. if test -f 'PACKNOTES' -a "${1}" != "-c" ; then 
  37.   echo shar: Will not clobber existing file \"'PACKNOTES'\"
  38. else
  39.   echo shar: Extracting \"'PACKNOTES'\" \(242 characters\)
  40.   sed "s/^X//" >'PACKNOTES' <<'END_OF_FILE'
  41. X
  42. X# "driver/v2.ip.fix//Driver.o.UU" was split into 2 parts; to create it, do
  43. X    cat driver/v2.ip.fix//Driver.UU.0[1-9] >driver/v2.ip.fix//Driver.o.UU
  44. X# Run uudecode to create "driver/v2.ip.fix//Driver.o":
  45. X    uudecode driver/v2.ip.fix//Driver.o.UU
  46. END_OF_FILE
  47.   if test 242 -ne `wc -c <'PACKNOTES'`; then
  48.     echo shar: \"'PACKNOTES'\" unpacked with wrong size!
  49.   fi
  50.   # end of 'PACKNOTES'
  51. fi
  52. if test -f 'README' -a "${1}" != "-c" ; then 
  53.   echo shar: Will not clobber existing file \"'README'\"
  54. else
  55.   echo shar: Extracting \"'README'\" \(3558 characters\)
  56.   sed "s/^X//" >'README' <<'END_OF_FILE'
  57. X
  58. XSLIP (Serial Link Internet Protocol)
  59. X
  60. XTo build and install the slip driver, the slip utilities, and the slip login
  61. X(dialslip) utilities, type the following command:
  62. X
  63. X    make
  64. X
  65. X
  66. XSLIP DRIVER
  67. X
  68. XIf you are using Unix System V Release 4.0.2 or below, you will need to copy
  69. Xv2.ip.fix/Driver.o to /etc/conf/pack.d/ip/Driver.o  before you build the
  70. Xkernel. The ip driver of Unix System V R 4.0.2 has a bug for a point to point
  71. Xconnection which panics the system. The v2.ip.fix/Driver.o fixes the problem.
  72. XSLIP (Serial Link Internet Protocol)
  73. X
  74. XIf you need to configure the second serial port, because your first serial
  75. Xport is used by other device, refer to Intel's Unix System V.4.0 Administra-
  76. Xtors Guide.
  77. X    
  78. XOnce the new ip driver and the slip have been installed, and your serial port
  79. Xhas been set up, you can build the kernel using the idbuild command. Don't
  80. Xforget to reboot your system after the idbuild command completes succesfully
  81. Xfor the new kernel to take into effect.
  82. X
  83. X
  84. XSLIP UTILITIES
  85. X
  86. Xslattach
  87. X
  88. XThe slattach command links the slip streams driver to the serial port and links
  89. Xthe ip driver to the slip driver.
  90. X
  91. XThe syntax of slattach is as following:
  92. X
  93. X    slattach [-i] nodename interface_name 
  94. XOR  slattach -d [-i] devname interface_name [ baudrate ]
  95. XOR  slattach - interface_name
  96. X
  97. XThe first option uses the Basic Networking Utilities (Advanced System
  98. XAdministration Volume 1 Chapter 7-15). Once the administration files
  99. Xare set up, you can use the remote node name to attach slip directly
  100. Xor through your modem. Example:
  101. X    slattach venus sl0
  102. X
  103. XThe "-d" does not use BNU but directly open the next argument which is
  104. Xthe serial device and link it to the slip driver. The baudrate sets up
  105. Xthe line speed of the serial line; the default baudrate is 9600.
  106. X
  107. XTo start the slip interface using the first serial port at 1200 baud
  108. Xexecute the below command:
  109. X
  110. X    slattach -d /dev/tty00 sl0 1200
  111. X
  112. XIf the slip hangup daemon (slhangupd) is run, slattach by default is set
  113. Xto receive hangup signal (SIGHUP) sent by the slip driver through slhangupd.
  114. XThe -i option ignores any hangup signal.
  115. X
  116. X
  117. Xifconfig
  118. X
  119. XThis utility is included in the standard base Unix System V Release 4.0
  120. Xproduct. Ifconfig is used to configure your system to the remote slip node.
  121. X
  122. X    ifconfig interface_name source destination up
  123. X
  124. X
  125. Xslhangupd
  126. X
  127. XSlhangup (slip hangup daemon) is a daemon used to receive messages sent by
  128. Xthe slip driver. Whenever the slip driver receives a M_HANGUP message from
  129. Xa particular line, the driver sends sends the process id of the controlling
  130. Xslattach process to slhangupd. Slhangup then will send a SIGHUP (hangup
  131. Xsignal) to the pid received from the slip driver.
  132. X
  133. XThere is no restriction of the execution order of slattach and slhangupd.
  134. X
  135. X
  136. Xsldetach
  137. X
  138. Xsldetach removes the serial line that is being used for slip connection.
  139. X
  140. X    sldetach interface_name
  141. X    
  142. X
  143. XDIALSLIP (slip login utilities)
  144. X
  145. XTo install dialslip:
  146. X
  147. X1.  Set up the /etc/slip.hosts file.  This file maps login names to IP
  148. X    addresses, which # comments, as usual.
  149. X
  150. X2.  Set up the /etc/slip.config file.  This file defines the IP address
  151. X    of the local system on each interface.  Set them all the same.  There
  152. X    can be as many simultaneous logins as lines in this file (not counting
  153. X    comments).
  154. X
  155. X3.  Run "mkslipuser".  This builds a file similar in nature to utmp that
  156. X    keeps track of who's logged in and what interface they're using.
  157. X    This command should also be run at boot time to clean things up.
  158. X
  159. X4.  Set up accounts for each system dialing in with "slip" as the shell
  160. X    with its setuid bit set to root.
  161. X
  162. END_OF_FILE
  163.   if test 3558 -ne `wc -c <'README'`; then
  164.     echo shar: \"'README'\" unpacked with wrong size!
  165.   fi
  166.   # end of 'README'
  167. fi
  168. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  169.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  170. else
  171.   echo shar: Extracting \"'MANIFEST'\" \(1363 characters\)
  172.   sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  173. X   File Name        Archive #    Description
  174. X----------------------------------------------------------
  175. XPACKNOTES                  1    
  176. XREADME                     1    
  177. XMANIFEST                   1    
  178. XMakefile                   4    
  179. Xdialslip                   1    
  180. Xdialslip/Makefile          4    
  181. Xdialslip/README.dialslip   4    
  182. Xdialslip/dslipuser.c       4    
  183. Xdialslip/mkslipuser.c      3    
  184. Xdialslip/slip.c            3    
  185. Xdialslip/slip.config       4    
  186. Xdialslip/slip.h            3    
  187. Xdialslip/slip.hosts        4    
  188. Xdriver                     1    
  189. Xdriver/ID                  1    
  190. Xdriver/ID/Master           2    
  191. Xdriver/ID/Node             4    
  192. Xdriver/ID/Space.c          2    
  193. Xdriver/ID/System           4    
  194. Xdriver/io                  1    
  195. Xdriver/io/slip.c           1    
  196. Xdriver/io/slip.mk          4    
  197. Xdriver/sys                 1    
  198. Xdriver/sys/slip.h          4    
  199. Xdriver/v2.ip.fix           1    
  200. Xdriver/v2.ip.fix/Driver.UU.01  2    
  201. Xdriver/v2.ip.fix/Driver.UU.02  1    
  202. Xman                        1    
  203. Xman/man1                   1    
  204. Xman/man1/dslipuser.1       3    
  205. Xman/man1/mkslipuser.1      3    
  206. Xman/man1/slattach.1        3    
  207. Xman/man1/sldetach.1        3    
  208. Xman/man1/slhangupd.1       4    
  209. Xman/man1/slip.1            3    
  210. Xman/man7                   1    
  211. Xman/man7/slip.7            3    
  212. Xutils                      1    
  213. Xutils/Makefile             4    
  214. Xutils/slattach.c           3    
  215. Xutils/sldetach             4    
  216. Xutils/slhangupd.c          3    
  217. END_OF_FILE
  218.   if test 1363 -ne `wc -c <'MANIFEST'`; then
  219.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  220.   fi
  221.   # end of 'MANIFEST'
  222. fi
  223. if test ! -d 'dialslip' ; then
  224.     echo shar: Creating directory \"'dialslip'\"
  225.     mkdir 'dialslip'
  226. fi
  227. if test ! -d 'driver' ; then
  228.     echo shar: Creating directory \"'driver'\"
  229.     mkdir 'driver'
  230. fi
  231. if test ! -d 'driver/ID' ; then
  232.     echo shar: Creating directory \"'driver/ID'\"
  233.     mkdir 'driver/ID'
  234. fi
  235. if test ! -d 'driver/io' ; then
  236.     echo shar: Creating directory \"'driver/io'\"
  237.     mkdir 'driver/io'
  238. fi
  239. if test -f 'driver/io/slip.c' -a "${1}" != "-c" ; then 
  240.   echo shar: Will not clobber existing file \"'driver/io/slip.c'\"
  241. else
  242.   echo shar: Extracting \"'driver/io/slip.c'\" \(21755 characters\)
  243.   sed "s/^X//" >'driver/io/slip.c' <<'END_OF_FILE'
  244. X/*
  245. X *            Copyright 1991, Intel Corporation
  246. X *                  All rights reserved.
  247. X *
  248. X * Permission to use, copy, modify, and distribute this software and
  249. X * its documentation for any purpose and without fee is hereby granted,
  250. X * provided that the above copyright notice appear in all copies and
  251. X * that both the copyright notice appear in all copies and that both
  252. X * the copyright notice and this permission notice appear in
  253. X * supporting documentation, and that the name of Intel Corporation
  254. X * not be used in advertising or publicity pertaining to distribution
  255. X * of the software without specific, written prior premission.
  256. X * 
  257. X * COMPANY AND/OR INTEL DISCLAIM ALL WARRANTIES WITH REGARD TO
  258. X * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
  259. X * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO
  260. X * EVENT SHALL COMPANY NOR INTEL BE LIABLE FOR ANY SPECIAL,
  261. X * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  262. X * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  263. X * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  264. X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  265. X * OF THIS SOFTWARE.
  266. X */
  267. X
  268. X/*
  269. X * Serial Line Internet Protocol (SLIP) streams multiplexor driver for
  270. X * Intel Unix System V/386 Release 4.0.
  271. X *
  272. X * The upper streams is supposed to be linked to the ip driver (/dev/ip)
  273. X * and optionally linked to the slip hangup daemon. The lower streams can
  274. X * linked to any number of serial driver.
  275. X *
  276. X * The slattach command builds the ip to slip to serial device links and
  277. X * The slhangupd command is a daemon for receiving M_HANGUP message from
  278. X * the serial driver.
  279. X *
  280. X * The packet framing protocol code, in the upper write and the lower
  281. X * read service routine (slip_uwsrv and slip_lrsrv) is based from
  282. X * tty_slip.c written by Rayan Zachariassen <rayan@ai.toronto.edu> and
  283. X * Doug Kingston <dpk@morgan.com>.
  284. X *
  285. X * Author:
  286. X *     Sudji Husodo <sudji@indo.intel.com> 1/9/91
  287. X */
  288. X
  289. X#include <sys/types.h>
  290. X#include <sys/kmem.h>
  291. X#include <sys/stream.h>
  292. X#include <sys/stropts.h>
  293. X#include <sys/dlpi.h>
  294. X#include <sys/syslog.h>
  295. X#include <sys/strlog.h>
  296. X#include <sys/socket.h>
  297. X#include <sys/sockio.h>
  298. X#include <sys/log.h>
  299. X#include <sys/errno.h>
  300. X#include <sys/ioctl.h>
  301. X#include <sys/param.h>
  302. X#include <sys/ddi.h>
  303. X
  304. X#include <net/if.h>
  305. X#include <netinet/in.h>
  306. X#include <netinet/in_systm.h>
  307. X#include <netinet/ip.h>
  308. X#include <sys/slip.h>
  309. X
  310. X#define DL_PRIM_SIZE    sizeof (union DL_primitives)
  311. X
  312. Xint slip_devflag = 0;        /* V4.0 style driver */
  313. X
  314. X#ifndef DEBUG
  315. Xstatic
  316. X#endif
  317. Xint slip_open(),  slip_close(), slip_uwput(), slip_uwsrv(),
  318. X    slip_lwput(), slip_lwsrv(), slip_lrput(), slip_lrsrv();
  319. X
  320. Xstatic struct module_info minfo[5] = {
  321. X    SLIPM_ID, "slip", 0, 8192, 16384, 4096,
  322. X    SLIPM_ID, "slip", 0, 8192, 16384, 4096,
  323. X    SLIPM_ID, "slip", 0, 8192, 16384, 4096,
  324. X    SLIPM_ID, "slip", 0, 8192, 16384, 4096,
  325. X    SLIPM_ID, "slip", 0, 8192, 16384, 4096,
  326. X};
  327. X
  328. Xstatic struct qinit urinit = {
  329. X    NULL,       NULL,       slip_open, slip_close, NULL, &minfo[0], NULL };
  330. X
  331. Xstatic struct qinit uwinit = {
  332. X    slip_uwput, slip_uwsrv, slip_open, slip_close, NULL, &minfo[1], NULL };
  333. X
  334. Xstatic struct qinit lrinit = {
  335. X    slip_lrput, slip_lrsrv, slip_open, slip_close, NULL, &minfo[3], NULL };
  336. X
  337. Xstatic struct qinit lwinit = {
  338. X    slip_lwput, slip_lwsrv, slip_open, slip_close, NULL, &minfo[4], NULL };
  339. X
  340. Xstruct streamtab slip_info = {
  341. X    &urinit, &uwinit, &lrinit, &lwinit };
  342. X
  343. Xslip_t *slip_hup = (slip_t *) 0;
  344. X
  345. Xextern    struct    ifstats    *ifstats;
  346. Xextern    u_int    slip_num;
  347. Xextern    slip_t    slip_data[];
  348. X
  349. X/*
  350. X * slip_open
  351. X */
  352. X
  353. X#ifndef DEBUG
  354. Xstatic
  355. X#endif
  356. Xslip_open (q, devp, flag, sflag, credp)
  357. Xqueue_t    *q;
  358. Xdev_t    *devp;
  359. Xint        flag;
  360. Xint        sflag;
  361. Xstruct    cred    *credp;
  362. X{
  363. X    register slip_t *p_slip;
  364. X    dev_t     dev;
  365. X    int         oldpri;
  366. X    mblk_t     *bp;
  367. X    major_t  major = getmajor (*devp);
  368. X    minor_t  minor = getminor (*devp);
  369. X
  370. X    STRLOG (SLIPM_ID,0,0,SL_TRACE,"slip_open: major %d minor %d",major,minor);
  371. X
  372. X    /* find an unused entry in slip_data */
  373. X
  374. X    if (sflag == CLONEOPEN) {
  375. X        for (dev=0, p_slip=&slip_data[0]; dev<slip_num; dev++, p_slip++)
  376. X            if (!p_slip->buf)
  377. X                break;
  378. X        minor = (minor_t) dev;
  379. X    }
  380. X
  381. X    /* if there's no more free entry, return No Space error code */
  382. X
  383. X    if (minor >= slip_num) {
  384. X        STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip open: can't allocate device");
  385. X        return ENXIO;
  386. X    }
  387. X
  388. X    /* initialized slip information */
  389. X
  390. X    oldpri = splstr ();
  391. X    p_slip->state    = DL_UNBOUND;
  392. X    p_slip->qtop     = q;
  393. X    p_slip->qbot     = NULL;
  394. X    p_slip->buf      = (u_char *) kmem_alloc (SLIPMTU, KM_SLEEP);
  395. X    p_slip->qt_blocked = 0;
  396. X    drv_getparm (PPID, &p_slip->pid);        /* keep process id */
  397. X
  398. X    p_slip->escape   = p_slip->overrun = p_slip->inlen = 0;
  399. X    p_slip->flags    = IFF_UP | IFF_POINTOPOINT;
  400. X    p_slip->uname[0] = '\0';
  401. X
  402. X    /* initialized interface and its statistics */
  403. X
  404. X    p_slip->stats.ifs_name       = (char *) p_slip->uname;
  405. X    p_slip->stats.ifs_unit       = 0;
  406. X    p_slip->stats.ifs_active     = 0;
  407. X    p_slip->stats.ifs_mtu        = SLIPMTU;
  408. X    p_slip->stats.ifs_ipackets   = p_slip->stats.ifs_opackets = 0;
  409. X    p_slip->stats.ifs_ierrors    = p_slip->stats.ifs_oerrors  = 0;
  410. X    p_slip->stats.ifs_collisions = 0;
  411. X    splx (oldpri);
  412. X
  413. X    /* initialize read and write queue pointers to private data */
  414. X
  415. X    q->q_ptr = (caddr_t) p_slip;
  416. X    WR(q)->q_ptr = (caddr_t) p_slip;
  417. X
  418. X    /* set up the correct stream head flow control parameters */
  419. X
  420. X    if (bp = allocb (sizeof (struct stroptions), BPRI_MED)) {
  421. X        struct stroptions *sop = (struct stroptions *) bp->b_rptr;
  422. X        bp->b_datap->db_type = M_SETOPTS;
  423. X        bp->b_wptr += sizeof (struct stroptions);
  424. X        sop->so_flags = SO_HIWAT | SO_LOWAT;
  425. X        sop->so_hiwat = minfo [2].mi_hiwat;
  426. X        sop->so_lowat = minfo [2].mi_lowat;
  427. X        putnext (q, bp);
  428. X    }
  429. X    *devp = makedevice (major, minor);
  430. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip open: device %d coming up", minor);
  431. X    return (0);
  432. X}
  433. X
  434. X/*
  435. X * slip_close ()
  436. X */
  437. X
  438. X#ifndef DEBUG
  439. Xstatic
  440. X#endif
  441. Xslip_close (q)
  442. Xqueue_t    *q;
  443. X{
  444. X    slip_t    *p_slip;
  445. X    dev_t     dev;
  446. X    int        oldpri;
  447. X
  448. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_close: going down ...");
  449. X    p_slip = (slip_t *) q->q_ptr;
  450. X    oldpri = splstr ();
  451. X
  452. X    if (p_slip->buf)
  453. X        kmem_free (p_slip->buf, SLIPMTU);
  454. X
  455. X    p_slip->state = DL_UNATTACHED;
  456. X    p_slip->buf   = 0;
  457. X    p_slip->inlen = 0;
  458. X    p_slip->qtop  = 0;
  459. X    p_slip->pid   = 0;
  460. X
  461. X    ifstats = p_slip->stats.ifs_next;         /* reset ifstats pointers */
  462. X    splx (oldpri);
  463. X}
  464. X
  465. X/*
  466. X *    slip_ioctl ()
  467. X */
  468. X
  469. X#ifndef DEBUG
  470. Xstatic
  471. X#endif
  472. Xslip_ioctl (q, mp)
  473. Xqueue_t    *q;
  474. Xmblk_t    *mp;
  475. X{
  476. X    struct iocblk *iocp;
  477. X    struct ifreq  *ifr;
  478. X    slip_t *p_slip;
  479. X    int        oldpri;
  480. X    struct    linkblk    *lp;
  481. X    slip_t *pp;
  482. X    u_char *p;
  483. X    int n;
  484. X
  485. X    p_slip  = (slip_t *) q->q_ptr;
  486. X    iocp = (struct iocblk *) mp->b_rptr;
  487. X
  488. X    STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: enter: case ('%c',%d)", 0x00FF&(iocp->ioc_cmd>>8), 0x00FF&iocp->ioc_cmd);
  489. X    oldpri = splstr ();
  490. X
  491. X    switch (iocp->ioc_cmd) {
  492. X
  493. X    case REG_SLHUP:
  494. X        STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: REG_SLHUP");
  495. X        if (slip_hup) {
  496. X            splx (oldpri);
  497. X            mp->b_datap->db_type = M_IOCNAK;
  498. X            qreply (q, mp);
  499. X            return (0);
  500. X        }
  501. X        else
  502. X            slip_hup = p_slip;
  503. X        break;
  504. X
  505. X    case UNREG_SLHUP:
  506. X        STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_ioctl: UNREG_SLHUP");
  507. X        slip_hup = 0;
  508. X        break;
  509. X
  510. X    case I_LINK:
  511. X        iocp->ioc_error = iocp->ioc_rval = iocp->ioc_count = 0;
  512. X
  513. X        lp = (struct linkblk *) mp->b_cont->b_rptr;
  514. X        p_slip->qbot = lp->l_qbot;
  515. X        p_slip->qbot->q_ptr = (char *) p_slip;
  516. X        OTHERQ (p_slip->qbot)->q_ptr = (char *) p_slip;
  517. X        break;
  518. X
  519. X    case I_UNLINK:
  520. X        iocp->ioc_error = iocp->ioc_rval = iocp->ioc_count = 0;
  521. X        p_slip->qbot = NULL;
  522. X        break;
  523. X
  524. X    case SIOCSIFNAME:
  525. X        ifr = (struct ifreq *) mp->b_cont->b_rptr;
  526. X
  527. X        /* copy interface name to local slip structure */
  528. X
  529. X        /*
  530. X         * interface name (ifr->ifr_name) contains the name and unit, e.g.
  531. X         * "sl0", "sl12", "emd0", "wd1", etc. Store the name in slip->uname
  532. X         * and unit in slip->unit. If unit is not supplied, e.g. "slip",
  533. X         * then unit number is assumed to be zero.
  534. X         */
  535. X
  536. X        strncpy (p_slip->uname, ifr->ifr_name, IFNAMSIZ);    /* copy name */
  537. X        n = 0;
  538. X
  539. X        /* starting from the last char, find the first non-digit char */
  540. X
  541. X        p = p_slip->uname + strlen(p_slip->uname) - 1;
  542. X        while ('0' <= *p && *p <= '9')
  543. X            p--;
  544. X
  545. X        /* calculate integer, replace them with nulls */
  546. X
  547. X        while (*++p) {
  548. X            n = 10*n + (*p-'0');
  549. X            *p = '\0';
  550. X        }
  551. X        p_slip->stats.ifs_unit = n;                /* set ifs unit number  */
  552. X
  553. X        /* search for matching interface name and unit */
  554. X
  555. X        for (n=0, pp=&slip_data[0]; n<slip_num; n++, pp++)
  556. X            if (pp != p_slip && pp->buf && !strcmp (pp->uname,p_slip->uname) &&
  557. X                pp->stats.ifs_unit == p_slip->stats.ifs_unit)
  558. X                break;
  559. X
  560. X        if (n < slip_num) {                            /* found matching ifname */
  561. X            splx (oldpri);
  562. X            mp->b_datap->db_type = M_IOCNAK;        /* Negative Ack reply */
  563. X            qreply (q, mp);
  564. X            return (0);
  565. X        }
  566. X        else {                                        /* ifname is unique */
  567. X            p_slip->stats.ifs_next = ifstats;        /* set ifstats pointers */
  568. X            ifstats = &p_slip->stats;                /* used for statistics */
  569. X        }                                            /* by netstat command */
  570. X        break;
  571. X
  572. X    case SIOCGIFFLAGS:
  573. X        ((struct iocblk_in *)iocp)->ioc_ifflags = p_slip->flags;
  574. X        break;
  575. X
  576. X    case SIOCSIFFLAGS:
  577. X        p_slip->flags = ((struct iocblk_in *)iocp)->ioc_ifflags;
  578. X        break;
  579. X
  580. X    case SIOCSIFADDR:
  581. X        p_slip->flags |= IFF_RUNNING;
  582. X        ((struct iocblk_in *)iocp)->ioc_ifflags |= IFF_RUNNING;
  583. X        break;
  584. X
  585. X    default:
  586. X        break;
  587. X    }
  588. X    splx (oldpri);
  589. X    mp->b_datap->db_type = M_IOCACK;
  590. X    qreply (q, mp);
  591. X}
  592. X
  593. X/*
  594. X * slip_uwput ()
  595. X */
  596. X
  597. X#ifndef DEBUG
  598. Xstatic
  599. X#endif
  600. Xslip_uwput (q, mp)
  601. Xqueue_t    *q;
  602. Xmblk_t    *mp;
  603. X{
  604. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_uwput: case 0x%2.2x", mp->b_datap->db_type);
  605. X
  606. X    switch (mp->b_datap->db_type) {
  607. X
  608. X    case M_FLUSH:
  609. X        if (*mp->b_rptr & FLUSHW) {
  610. X            flushq(q, FLUSHALL);
  611. X            *mp->b_rptr &= ~FLUSHW;
  612. X        }
  613. X        if (*mp->b_rptr & FLUSHR)
  614. X            qreply(q, mp);
  615. X        else
  616. X            freemsg(mp);
  617. X        break;
  618. X
  619. X    case M_IOCTL:
  620. X        slip_ioctl (q, mp);
  621. X        break;
  622. X
  623. X    case M_PROTO:
  624. X    case M_PCPROTO:
  625. X        slip_dl_cmds (q, mp);
  626. X        break;
  627. X
  628. X    default:
  629. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwput: unknown message type, passing message to the next queue");
  630. X        putnext (((slip_t *)q->q_ptr)->qbot, mp);
  631. X        break;
  632. X    } 
  633. X}
  634. X
  635. X/*
  636. X * slip_uwsrv ()
  637. X */
  638. X
  639. X#ifndef DEBUG
  640. Xstatic
  641. X#endif
  642. Xslip_uwsrv (q)
  643. Xregister queue_t *q;
  644. X{
  645. X    register mblk_t    *mp, *mpd, *mp2;
  646. X    register u_char    *cp;
  647. X    register int    pktlen, num;
  648. X    register slip_t *p_slip;
  649. X
  650. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_uwsrv: enter");
  651. X
  652. X    while ((mp = getq(q)) != NULL) {
  653. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: got message from q");
  654. X        p_slip = (slip_t *) q->q_ptr;
  655. X
  656. X
  657. X        if (!canput (p_slip->qbot)) {
  658. X            STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: can't put message to qbot");
  659. X            putbq (q, mp);
  660. X            p_slip->qt_blocked = 1;
  661. X            return;
  662. X        }
  663. X        pktlen = 0;
  664. X
  665. X        /*
  666. X         * count the number of special characters (END & ESC)
  667. X         */
  668. X
  669. X        num = 2;        /* END char is put at the start and end of packet */
  670. X
  671. X        for (mpd = mp->b_cont; mpd != 0; mpd = mpd->b_cont) {
  672. X            pktlen += (mpd->b_wptr - mpd->b_rptr);
  673. X
  674. X            for (cp = mpd->b_rptr; cp < mpd->b_wptr; cp++) {
  675. X                if (*cp == END || *cp == ESC)
  676. X                    num++;
  677. X            }
  678. X        }
  679. X        STRLOG (SLIPM_ID, 1, 0, SL_TRACE, "slip_uwsrv: # of bytes in packet = %d; # of special character in packet: %d", pktlen, num);
  680. X
  681. X        /*
  682. X         * allocate message block to be sent down stream
  683. X         */
  684. X
  685. X        if ((mp2 = allocb (pktlen + num, BPRI_MED)) == NULL) {
  686. X            STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_uwsrv: can't allocate message block - dropping outgoing message");
  687. X            p_slip->stats.ifs_oerrors++;
  688. X            freemsg (mp);
  689. X            return;
  690. X        }
  691. X        /*
  692. X         * frame packet, escape special characters ESC and END
  693. X         */
  694. X
  695. X        *mp2->b_wptr++ = END;
  696. X
  697. X        for (mpd = mp->b_cont; mpd != 0; mpd = mpd->b_cont) {
  698. X            for (cp = mpd->b_rptr; cp < mpd->b_wptr; cp++) {
  699. X                if (*cp == END) {
  700. X                    *mp2->b_wptr++ = ESC;
  701. X                    *mp2->b_wptr++ = ESC_END;
  702. X                }
  703. X                else if (*cp == ESC) {
  704. X                    *mp2->b_wptr++ = ESC;
  705. X                    *mp2->b_wptr++ = ESC_ESC;
  706. X                }
  707. X                else
  708. X                    *mp2->b_wptr++ = *cp;
  709. X            }
  710. X        }
  711. X        *mp2->b_wptr++ = END;
  712. X
  713. X        mp2->b_datap->db_type = M_DATA;
  714. X        p_slip->stats.ifs_opackets++;
  715. X        freemsg (mp);
  716. X        slip_lwput (p_slip->qbot, mp2);
  717. X    }
  718. X}
  719. X
  720. X/*
  721. X * slip_lwput
  722. X */
  723. X
  724. X#ifndef DEBUG
  725. Xstatic
  726. X#endif
  727. Xslip_lwput (q, mp)
  728. Xqueue_t *q;
  729. Xmblk_t  *mp;
  730. X{
  731. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: enter %x, %x",q , mp);
  732. X
  733. X    if (canput(q->q_next)) {
  734. X        STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: putnext");
  735. X        putnext(q, mp);
  736. X    }
  737. X    else {
  738. X        STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lwput: putq");
  739. X        putq(q, mp);
  740. X    }
  741. X}
  742. X
  743. X/*
  744. X * slip_lwsrv (q)
  745. X */
  746. X
  747. X#ifndef DEBUG
  748. Xstatic
  749. X#endif
  750. Xslip_lwsrv (q)
  751. Xqueue_t *q;
  752. X{
  753. X    mblk_t  *mp;
  754. X    slip_t *p_slip;
  755. X
  756. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: enter");
  757. X
  758. X    while (mp = getq(q)) {
  759. X        STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: getq (%x) = %x",q, mp);
  760. X        if (canput(q->q_next)) {
  761. X            STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: putnext");
  762. X            putnext(q, mp);
  763. X        }
  764. X        else {
  765. X            STRLOG (SLIPM_ID, 0, 0, SL_TRACE,"slip_lwsrv: putbq");
  766. X            putbq(q, mp);
  767. X            return;
  768. X        }
  769. X    }
  770. X    p_slip = (slip_t *) q->q_ptr;
  771. X
  772. X    if (p_slip->qt_blocked) {
  773. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_lwsrv: slip_uwsrv is blocked, enable it");
  774. X        /*
  775. X         * qtop is the upper read q and
  776. X         * we want to enable the upper write q
  777. X         */
  778. X        qenable (WR(p_slip->qtop));
  779. X        p_slip->qt_blocked = 0;
  780. X    }
  781. X}
  782. X
  783. X/*
  784. X * slip_lrput ()
  785. X */
  786. X
  787. X#ifndef DEBUG
  788. Xstatic
  789. X#endif
  790. Xslip_lrput (q, mp)
  791. Xqueue_t    *q;
  792. Xmblk_t    *mp;
  793. X{
  794. X    slip_t     *p_slip;
  795. X    mblk_t    *resp;
  796. X    int        device;
  797. X    int        oldpri;
  798. X
  799. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrput: enter: case 0x%2.2x", mp->b_datap->db_type);
  800. X    p_slip = (slip_t *) q->q_ptr;
  801. X
  802. X    switch (mp->b_datap->db_type) {
  803. X
  804. X    case M_DATA:
  805. X        STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_lrput: putq (%x, %x)", q, mp);
  806. X        putq (q, mp);
  807. X        break;
  808. X
  809. X    case M_FLUSH:
  810. X        STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_lrput: M_FLUSH type = %x",*mp->b_rptr);
  811. X        if (*mp->b_rptr & FLUSHR)
  812. X            flushq(q, FLUSHALL);
  813. X        if (*mp->b_rptr & FLUSHW) {
  814. X            *mp->b_rptr &= ~FLUSHR;
  815. X            flushq(WR(q), FLUSHALL);
  816. X            qreply(q, mp);
  817. X        } else
  818. X            freemsg(mp);
  819. X        return;
  820. X
  821. X    case M_HANGUP:
  822. X        oldpri = splstr ();
  823. X        /*
  824. X         * if pid is set, ignore message
  825. X         */
  826. X        if (p_slip->pid == 0)
  827. X            freemsg (mp);
  828. X        /*
  829. X         * else if slip hangup daemon exists send pid to the daemon
  830. X         */
  831. X        else if (slip_hup && (resp = allocb (sizeof(pid_t),BPRI_MED))) {
  832. X            STRLOG (SLIPM_ID,1,0,SL_TRACE,
  833. X                "slip_lrput: sending pid %d to hangup daemon", p_slip->pid);
  834. X            *(pid_t *) resp->b_wptr = p_slip->pid;
  835. X            resp->b_wptr += sizeof (pid_t);
  836. X            resp->b_datap->db_type = M_PCPROTO;
  837. X            putnext (slip_hup->qtop, resp);
  838. X            freemsg (mp);
  839. X        }
  840. X        /*
  841. X         * else pass the message upstream
  842. X         */
  843. X        else
  844. X            putnext (p_slip->qtop, mp);
  845. X
  846. X        splx (oldpri);
  847. X        break;
  848. X            
  849. X    default:
  850. X        putnext (p_slip->qtop, mp);
  851. X        break;
  852. X    }
  853. X}
  854. X
  855. X/*
  856. X * slip_lrsrv ()
  857. X */
  858. X
  859. X#ifndef DEBUG
  860. Xstatic
  861. X#endif
  862. Xslip_lrsrv (q)
  863. Xqueue_t    *q;
  864. X{
  865. X    register    u_char     *cp;
  866. X    register    slip_t     *p_slip;
  867. X    mblk_t        *bp, *mp, *mp1, *mp2;
  868. X
  869. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrsrv: enter");
  870. X
  871. X    while ((mp = getq(q)) != NULL) {
  872. X        p_slip = (slip_t *) q->q_ptr;
  873. X
  874. XSTRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_lrsrv: q=%x, mp=%x;", q, mp);
  875. X        if (!canput (p_slip->qtop->q_next)) {
  876. X            putbq (q, mp);
  877. X            return;
  878. X        }
  879. X        p_slip = (slip_t *) q->q_ptr;
  880. X
  881. X        for (bp = mp; bp != 0; bp = bp->b_cont) {
  882. X            for (cp = bp->b_rptr; cp < bp->b_wptr; cp++) {
  883. X                if (*cp == END) {
  884. X                    if (p_slip->inlen < sizeof (struct ip))
  885. X                        ;                        /* ignore packet */
  886. X
  887. X                    else if (p_slip->overrun)
  888. X                        p_slip->stats.ifs_ierrors++;
  889. X
  890. X                    else if ((mp1=allocb (DL_UNITDATA_IND_SIZE,BPRI_MED))==NULL)
  891. X                        p_slip->stats.ifs_ierrors++;
  892. X
  893. X                    else if ((mp2 = allocb (p_slip->inlen, BPRI_MED)) == NULL) {
  894. X                        p_slip->stats.ifs_ierrors++;
  895. X                        freemsg (mp1);
  896. X                    }
  897. X                    else {
  898. X                        p_slip->stats.ifs_ipackets++;    /* send unit data */
  899. X                        linkb (mp1, mp2);                /* indication up */
  900. X                        slip_dl_unitdata_ind (q, mp1);    /* stream */
  901. X                        putnext (p_slip->qtop, mp1);
  902. X                    }
  903. X                    p_slip->inlen = 0;                    /* reset info for */
  904. X                    p_slip->overrun = 0;                /* receiving data */
  905. X                    p_slip->escape = 0;
  906. X                }
  907. X                else if (p_slip->inlen >= SLIPMTU)
  908. X                    p_slip->overrun = 1;
  909. X
  910. X                else if (*cp == ESC)                    /* if data is ESC */
  911. X                    p_slip->escape = 1;
  912. X
  913. X                else if (p_slip->escape) {
  914. X                    p_slip->escape = 0;
  915. X
  916. X                    if (*cp == ESC_END)
  917. X                        *(p_slip->buf + p_slip->inlen++) = END;
  918. X                    else if (*cp == ESC_ESC)
  919. X                        *(p_slip->buf + p_slip->inlen++) = ESC;
  920. X                    else
  921. X                        *(p_slip->buf + p_slip->inlen++) = *cp;
  922. X                }
  923. X                else
  924. X                    *(p_slip->buf + p_slip->inlen++) = *cp;
  925. X            }
  926. X            bp->b_rptr = cp;
  927. X        }
  928. X        freemsg (mp);
  929. X    }
  930. X}
  931. X
  932. X/*
  933. X * slip_dl_cmds ()
  934. X */
  935. X
  936. X#ifndef DEBUG
  937. Xstatic
  938. X#endif
  939. Xslip_dl_cmds (q, mp)
  940. Xqueue_t    *q;
  941. Xmblk_t    *mp;
  942. X{
  943. X    union DL_primitives    *p_dl;
  944. X    mblk_t                *response;
  945. X    slip_t                *p_slip;
  946. X    int        oldpri;
  947. X
  948. X    if ((response = allocb (DL_PRIM_SIZE, BPRI_MED)) == NULL) {
  949. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: can't allocate response buffer");
  950. X        freemsg (mp);
  951. X        return;
  952. X    }
  953. X
  954. X    p_slip = (slip_t *) q->q_ptr;
  955. X    p_dl = (union DL_primitives *) mp->b_datap->db_base;
  956. X
  957. X    switch (p_dl->dl_primitive) {
  958. X
  959. X    case DL_INFO_REQ:
  960. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_INFO_REQ");
  961. X        slip_dl_info_ack (q, mp, response);
  962. X        break;
  963. X
  964. X    case DL_BIND_REQ:
  965. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_BIND_REQ");
  966. X        if (p_slip->state == DL_UNBOUND) {
  967. X            oldpri = splstr ();
  968. X            p_slip->sap   = ((dl_bind_req_t *)p_dl)->dl_sap;
  969. X            p_slip->state = DL_IDLE;
  970. X            p_slip->stats.ifs_active = 1;
  971. X            splx (oldpri);
  972. X
  973. X            slip_dl_bind_ack (q, mp, response);
  974. X        }
  975. X        else
  976. X            slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
  977. X        break;
  978. X
  979. X    case DL_UNBIND_REQ:
  980. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_UNBIND_REQ");
  981. X        if (p_slip->state == DL_IDLE) {
  982. X            oldpri = splstr ();
  983. X            p_slip->state = DL_UNBOUND;
  984. X            p_slip->stats.ifs_active = 0;
  985. X            splx (oldpri);
  986. X
  987. X            flushq (q, FLUSHDATA);                        /* Flush both q's */
  988. X            flushq (RD(q), FLUSHDATA);
  989. X
  990. X            slip_dl_ok_ack (q, mp, response);
  991. X        }
  992. X        else
  993. X            slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
  994. X
  995. X        break;
  996. X
  997. X    case DL_UNITDATA_REQ:
  998. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: DL_UNITDATA_REQ");
  999. X        if (p_slip->state == DL_IDLE) {
  1000. X            STRLOG (SLIPM_ID,2,0,SL_TRACE,"slip_dl_cmd: putq (%x, %x)", q, mp);
  1001. X            putq (q, mp);
  1002. X            return;
  1003. X        }
  1004. X        else
  1005. X            slip_dl_error_ack (q, mp, response, DL_OUTSTATE);
  1006. X
  1007. X        break;
  1008. X
  1009. X    default:
  1010. X        STRLOG (SLIPM_ID,1,0,SL_TRACE,"slip_dl_cmd: default 0x%2.2x",p_dl->dl_primitive);
  1011. X        slip_dl_error_ack (q, mp, response, DL_UNSUPPORTED);
  1012. X        break;
  1013. X    }
  1014. X    freemsg (mp);
  1015. X    putnext (RD(q), response);
  1016. X}
  1017. X
  1018. X/*
  1019. X *  slip_dl_info_ack ()
  1020. X */
  1021. X
  1022. X#ifndef DEBUG
  1023. Xstatic
  1024. X#endif
  1025. Xslip_dl_info_ack (q, mp, response)
  1026. Xqueue_t *q;
  1027. Xmblk_t    *mp;
  1028. Xmblk_t    *response;
  1029. X{
  1030. X    dl_info_ack_t    *p_info_ack;
  1031. X    slip_t            *p_slip;
  1032. X
  1033. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_info_ack: enter");
  1034. X
  1035. X    p_slip = (slip_t *) q->q_ptr;
  1036. X
  1037. X    p_info_ack = (dl_info_ack_t *) response->b_wptr;
  1038. X    p_info_ack->dl_primitive     = DL_INFO_ACK;
  1039. X    p_info_ack->dl_max_sdu       = SLIPMTU;
  1040. X
  1041. X    p_info_ack->dl_min_sdu       = 46;                  /* ????? */
  1042. X    p_info_ack->dl_addr_length   = 0;                    /* ????? MAC_ADD_SIZE*/
  1043. X    p_info_ack->dl_mac_type      = DL_CHAR;                /* ????? */
  1044. X
  1045. X    p_info_ack->dl_current_state = p_slip->state;
  1046. X    p_info_ack->dl_service_mode  = DL_CLDLS;            /* connecionless DL */
  1047. X
  1048. X    p_info_ack->dl_qos_length       = 0;                /* ???? */
  1049. X    p_info_ack->dl_qos_offset       = 0;                /* ???? */
  1050. X    p_info_ack->dl_qos_range_length = 0;                /* ???? */
  1051. X    p_info_ack->dl_qos_range_offset = 0;                /* ???? */
  1052. X
  1053. X    p_info_ack->dl_provider_style = DL_STYLE1;
  1054. X
  1055. X    p_info_ack->dl_addr_offset = 0;                        /* ???? */
  1056. X    p_info_ack->dl_growth = 0;
  1057. X
  1058. X    response->b_datap->db_type = M_PCPROTO;
  1059. X    response->b_wptr           += DL_INFO_ACK_SIZE;
  1060. X}
  1061. X
  1062. X/*
  1063. X *  slip_dl_bind_ack ()
  1064. X */
  1065. X
  1066. X#ifndef DEBUG
  1067. Xstatic
  1068. X#endif
  1069. Xslip_dl_bind_ack (q, mp, response)
  1070. Xqueue_t *q;
  1071. Xmblk_t    *mp;
  1072. Xmblk_t    *response;
  1073. X{
  1074. X    dl_bind_req_t    *p_dl;
  1075. X    dl_bind_ack_t    *p_bind;
  1076. X
  1077. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_bind_ack: enter");
  1078. X
  1079. X    p_dl = (dl_bind_req_t *) mp->b_datap->db_base;
  1080. X
  1081. X    p_bind = (dl_bind_ack_t *) response->b_wptr;
  1082. X    p_bind->dl_primitive   = DL_BIND_ACK;
  1083. X    p_bind->dl_sap         = p_dl->dl_sap;
  1084. X    p_bind->dl_addr_length = 0;
  1085. X    p_bind->dl_addr_offset = 0;
  1086. X
  1087. X    response->b_wptr           += DL_BIND_ACK_SIZE;
  1088. X    response->b_datap->db_type = M_PCPROTO;
  1089. X}
  1090. X
  1091. X/*
  1092. X *  slip_dl_ok_ack ()
  1093. X */
  1094. X
  1095. X#ifndef DEBUG
  1096. Xstatic
  1097. X#endif
  1098. Xslip_dl_ok_ack (q, mp, response)
  1099. Xqueue_t *q;
  1100. Xmblk_t    *mp;
  1101. Xmblk_t    *response;
  1102. X{
  1103. X    union DL_primitives    *p_dl;
  1104. X    dl_ok_ack_t            *p_ok_ack;
  1105. X
  1106. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_ok_ack: enter");
  1107. X
  1108. X    p_dl = (union DL_primitives *) mp->b_datap->db_base;
  1109. X
  1110. X    p_ok_ack = (dl_ok_ack_t *)(response->b_wptr);
  1111. X    p_ok_ack->dl_primitive         = DL_OK_ACK;
  1112. X    p_ok_ack->dl_correct_primitive = p_dl->dl_primitive;
  1113. X
  1114. X    response->b_wptr           += DL_OK_ACK_SIZE;
  1115. X    response->b_datap->db_type = M_PCPROTO;
  1116. X}
  1117. X
  1118. X/*
  1119. X * slip_dl_error_ack
  1120. X */
  1121. X
  1122. X#ifndef DEBUG
  1123. Xstatic
  1124. X#endif
  1125. Xslip_dl_error_ack (q, mp, response, dl_errno)
  1126. Xqueue_t *q;
  1127. Xmblk_t    *mp;
  1128. Xmblk_t    *response;
  1129. Xulong    dl_errno;
  1130. X{
  1131. X    union DL_primitives    *p_dl;
  1132. X    dl_error_ack_t        *p_error;
  1133. X
  1134. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_error_ack: enter");
  1135. X
  1136. X    p_dl = (union DL_primitives *) mp->b_datap->db_base;
  1137. X
  1138. X    p_error = (dl_error_ack_t *) response->b_wptr;
  1139. X    p_error->dl_primitive       = DL_ERROR_ACK;
  1140. X    p_error->dl_error_primitive = p_dl->dl_primitive;
  1141. X    p_error->dl_errno           = dl_errno;
  1142. X    p_error->dl_unix_errno      = 0;
  1143. X
  1144. X    response->b_wptr           += DL_ERROR_ACK_SIZE;
  1145. X    response->b_datap->db_type = M_PCPROTO;
  1146. X}
  1147. X
  1148. X/*
  1149. X * slip_dl_unitdata_ind ()
  1150. X */
  1151. X
  1152. X#ifndef DEBUG
  1153. Xstatic
  1154. X#endif
  1155. Xslip_dl_unitdata_ind (q, mp)
  1156. Xqueue_t *q;
  1157. Xmblk_t    *mp;
  1158. X{
  1159. X    dl_unitdata_ind_t    *p_dl;
  1160. X    slip_t                *p_slip;
  1161. X
  1162. X    STRLOG (SLIPM_ID, 0, 0, SL_TRACE, "slip_dl_unitdata_ind: enter");
  1163. X
  1164. X    p_dl = (dl_unitdata_ind_t *) mp->b_wptr;
  1165. X    p_dl->dl_primitive = DL_UNITDATA_IND;
  1166. X    p_dl->dl_dest_addr_length = 0;
  1167. X    p_dl->dl_dest_addr_offset = DL_UNITDATA_IND_SIZE;
  1168. X    p_dl->dl_src_addr_length = 0;
  1169. X    p_dl->dl_src_addr_offset = p_dl->dl_dest_addr_offset + p_dl->dl_dest_addr_length;
  1170. X
  1171. X    mp->b_wptr += DL_UNITDATA_IND_SIZE;
  1172. X    mp->b_datap->db_type = M_PROTO;
  1173. X
  1174. X    /* copy packet received to the next message block */
  1175. X
  1176. X    p_slip = (slip_t *) q->q_ptr;
  1177. X
  1178. X    bcopy ((caddr_t)p_slip->buf, (caddr_t)mp->b_cont->b_wptr, p_slip->inlen);
  1179. X
  1180. X    mp->b_cont->b_wptr += p_slip->inlen;
  1181. X}
  1182. END_OF_FILE
  1183.   if test 21755 -ne `wc -c <'driver/io/slip.c'`; then
  1184.     echo shar: \"'driver/io/slip.c'\" unpacked with wrong size!
  1185.   fi
  1186.   # end of 'driver/io/slip.c'
  1187. fi
  1188. if test ! -d 'driver/sys' ; then
  1189.     echo shar: Creating directory \"'driver/sys'\"
  1190.     mkdir 'driver/sys'
  1191. fi
  1192. if test ! -d 'driver/v2.ip.fix' ; then
  1193.     echo shar: Creating directory \"'driver/v2.ip.fix'\"
  1194.     mkdir 'driver/v2.ip.fix'
  1195. fi
  1196. if test -f 'driver/v2.ip.fix/Driver.UU.02' -a "${1}" != "-c" ; then 
  1197.   echo shar: Will not clobber existing file \"'driver/v2.ip.fix/Driver.UU.02'\"
  1198. else
  1199.   echo shar: Extracting \"'driver/v2.ip.fix/Driver.UU.02'\" \(20206 characters\)
  1200.   sed "s/^X//" >'driver/v2.ip.fix/Driver.UU.02' <<'END_OF_FILE'
  1201. XM[B\```)A``#^+P```:````HP```!!0``#S````+&``!D,````J@``&\P```!
  1202. XMH```=S````$%``!\,````L8``(4P```"M```CC````&@``"6,````04``)LP
  1203. XM```"Q@``MS````)````",0```5,``$PQ```!TP``SC$```+$``#B,0```5,`
  1204. XM`.<Q```!4P``[C$```%3``#W,0```5,``(0R```"P```GC(```'3``"F,@``
  1205. XM`K0``.,R```"P````#,```*T``"/,P```DL``/8S```"X0``&S0```*T``!'
  1206. XM-````N$``($T```"8```AS0```%3``"4-````3```)DT```"<P``H30```%V
  1207. XM``"Y-````=,``,@T```!4P``TS0```%3``#>-````=,``.PT```!4P``O34`
  1208. XM``)'```F-@```KX``$$V```"+P``2#8```+?``"+-@```KX``-DV```"O@``
  1209. XM'#<```*^``#2-P```KX``.0W```"1P``'3@```*^```I.````JT``$`X```"
  1210. XMO@``7S@```)J``!J.````K0``)\X```!O0``IC@```&]``#*.````HL``.TX
  1211. XM```!O0``\C@```)(```1.0```HL``%,Y```"BP``BSD```%#``"4.0```04`
  1212. XM`)DY```"Q@``ICD```$8``"L.0```KX``+HY```!3P``OSD```%/``#%.0``
  1213. XM`4\``,PY```!&```X#D```%/``#J.0```4\``/XY```"80``%3H```%/```D
  1214. XM.@```4\``"LZ```!&```.#H```$8``!*.@```1@``$\Z```"O@``;CH```$8
  1215. XM``#(.@```KX```,[```"O@``/CL```*^``"\.P```4,``.T[```!!0``\CL`
  1216. XM``+&```,/````<<``!4\```!I0``'CP```&@```F/````04``"L\```"Q@``
  1217. XM,CP```'3```Z/````K0``%$\```"P0``7#P```&@``!D/````04``&D\```"
  1218. XMQ@``<CP```*T``"C/````E@``*X\```!O0``M#P```&]``#+/````;T``-,\
  1219. XM```!O0``XSP```&]``#H/````HL``/$\```!O0``_CP```&]```1/0```;T`
  1220. XM`!8]```"2```*#T```&]```X/0```;T``#T]```"BP``13T```&]``!2/0``
  1221. XM`;T``&(]```!O0``;CT```&]``!_/0```;T``)L]```!O0``KCT```'4```#
  1222. XM/@```;T``!8^```!O0``.SX```&]``!./@```;T``&T^```!:```G3X```%]
  1223. XM``"E/@```4,``+H^```!!0``OSX```+&``#+/@```F$``-T^```"M```[#X`
  1224. XM``*T```Q/P```;T``&P_```!LP``>C\```&)``""/P```8D``(P_```"M```
  1225. XMFS\```*T``"N/P```;T``+8_```!O0``QS\```&S``#0/P```N```.$_```!
  1226. XMO0``\3\```&]``#V/P```HL```%````!O0``#D````&]```>0````=,``#!`
  1227. XM```!TP``J$````)J``"]0````K0``-)````"M```V4````'3``#]0````J<`
  1228. XM`&A!```"0```@D$```)A``#!00```KX``-%!```"O```6D(```%Q``!A0@``
  1229. XM`7$``+%"```"6@``O4(```%H```L0P```HL``'!#```";0``BT,```(O``"2
  1230. XM0P```M\``,-#```"2```YD,```*+```,1````>```!%$```"7P``1$0```*G
  1231. XM``"E1````J@``+E$```":@``YD0```)0``"R10```E4``,M%```"J```Z$4`
  1232. XM``*V```\1@```H(``&)&```"80``7T<```)5``"G1P```IP``+5'```"M```
  1233. XMV$<```*H``#U1P```K8``$1(```"M```;4@```*+``"?2````7T``*E(```!
  1234. XM?0``ZT@```*H```)20```K8``"1)```"J```/4D```)```!/20```FL``*9)
  1235. XM```"80``Q4D```*^``#<20```KX``/I)```"C```EDH```*^```22P```04`
  1236. XM`!E+```"N```34L```)9``!<2P```K0``)]+```!!0``IDL```*X```'3```
  1237. XM`F$``"Q,```!(```-$P```+:```Z3````2```$1,```!70``4DP```%=``!P
  1238. XM3````;,``'Y,```!B0``BDP```&)``"33````C8``*E,```"S```Q4P```)A
  1239. XM``#53````;,```%-```"C```"4T```(V```T30```1L``#U-```!&P``:$T`
  1240. XM``$%``!O30```K@``)%-```"8P```TX```)C```L3@```KP``&).```!`P``
  1241. XMB$X```*\``#,3@```6\``-).```!;P``\4X```*\```%3P```K8``"A/```"
  1242. XMM```.$\```*T``!(3P```;,``%=/```!LP``>4\```*\``"'3P```8D``+5/
  1243. XM```"O```W$\```&S``#M3P```6\``!10```"O```)%````&S```S4````6\`
  1244. XM`#Q0```!B0``0E````%O``!;4````6\``&%0```!B0``:U````&S``!Y4```
  1245. XM`6\``)=0```!?0``W5````*\``#X4````BH``"U1```"O```F%$```%H``#;
  1246. XM40```1L``.-1```"-P``&U(```*\```O4@```IT``$%2```!:```35(```%H
  1247. XM``!74@```7```%]2```!<```@E(```%H``"(4@```K4``+A2```"80``#U,`
  1248. XM``*\``!34P```KP``&53```"80``CE,```*\```T5````KP``(Y4```!:```
  1249. XMGU0```*^``#-5````7T```I5```"O```'E4```%=```G50```7T``"M5```!
  1250. XM:```,%4```&S```Y50```6@``$15```"-@``3E4```%P``!550```6@``%I5
  1251. XM```"M0``8E4```'"``!M50```7$``'E5```!B0``?U4```%O``"-50```I\`
  1252. XM`))5```",```F%4```%=``"A50```G0```Y6```!!0``%58```*X```>5@``
  1253. XM`K0``"M6```">P``4%8```$#``!H5@```K0``(U6```"O```GU8```*V``"]
  1254. XM5@```F,``-Y6```"8P``Z%8```*\``#V5@```K0```)7```"M```,E<```%O
  1255. XM```X5P```8D``$17```!;P``2U<```&S``!65P```J@``'Q7```!LP``B5<`
  1256. XM``)8``"85P```;,``*)7```!LP``LU<```&)``"[5P```K0``,I7```!W```
  1257. XMTE<```'<``"06````K0``,98```"O````%D```*T``!"60```KP``'99```"
  1258. XM80``A5D```*,``"D60```KX``,A9```"C```Z%D```)A``#W60```3H```5:
  1259. XM```"FP``6%H```*U``"I6@```4X``.E:```!!```05L```*Q``!*6P```F$`
  1260. XM`(5;```"M0``G5L```*^``#Z6P```F$``"%<```"80``AUP```*T```F70``
  1261. XM`K0``#I=```"@@``2%T```*\``#;7@```I0``.5>```!>@``\EX```%<```0
  1262. XM7P```58``!E?```!<@``(U\```%R``!+7P```:(``'%?```!!0``=E\```+&
  1263. XM``#)7P```7(``-5?```!H@``ZU\```(U```O8````04``#1@```";```4V``
  1264. XM``(N``!I8````5X``'%@```"C```DV````(_``"?8````:(``.!@```"1P``
  1265. XM[&````&B```180```7(``!]A```">@``:&$```&B``"_80```:(``-EA```!
  1266. XMH@``XV$```&B``!.8@```I0``&YB```!7```@F(```%6``#)8@```GH``$-C
  1267. XM```!I0``8&,```%>``!V8P```HP``*1C```!)P``K6,```&E``#:8P```FT`
  1268. XM``!D```"1P``&V0```(_```]9````F$``.ID```"80```F4```*U```O90``
  1269. XM`HP``$UE```!7```I64```%6``"]90```;\``,)E```!!0``R64```*X``#1
  1270. XM90```04``-AE```"N```X&4```$%``#G90```K@``.]E```!!0``]F4```*X
  1271. XM``#^90```04```5F```"N`````````$"```$`````0(```@````!`@``#```
  1272. XM``$"```0`````0(``!0````!`@``&`````$"```<`````0(``"`````!`@``
  1273. XM)`````$"```H`````0(``"P````!`@``,`````$"```T`````0(``#@````!
  1274. XM`@``&`````$3```D`````1(``#`````!$@``/`````$2``!(`````1(``%0`
  1275. XM```!$@``8`````$2``!L`````1(``'@````!$@``$`$```$%```H`0```04`
  1276. XM`$`!```!!0``6`$```$%``!P`0```04``(P!```!D@``D`$```&(``"8`0``
  1277. XM`1L``*`!```!E0``I`$```%2``"H`0```9(``*P!```!B```M`$```$;``"\
  1278. XM`0```50``,`!```!U@``Q`$```&2``#(`0```8@``-`!```!&P``V`$```&&
  1279. XM``#<`0```3L``.`!```!D@``Y`$```&(``#L`0```1L``/0!```!'```^`$`
  1280. XM``$=``#\`0```1X````"```!'P``0"@C*6ME<FXM:6YE=#II;BYC"3$N,P!`
  1281. XM*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIT>7!E
  1282. XM<RYH"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C
  1283. XM*6AE860N<WES.F9S+W,U<&%R86TN:`DQ+C,N,BXQ`$`H(REH96%D+G-Y<SIS
  1284. XM;V-K:6\N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SII;V-C;VTN:`DQ+C$N,2XQ
  1285. XM`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.G-T
  1286. XM<F]P=',N:`DQ+C0N-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`
  1287. XM*",I:&5A9"YS>7,Z979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')E
  1288. XM86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N-RXQ`$`H
  1289. XM(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z<&]L;"YH
  1290. XM"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ`$`H(REH
  1291. XM96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@)
  1292. XM,2XQ+C0N,0!`*",I:&5A9"YS>7,Z<V]C:V5T=F%R+F@),2XQ+C$N,0!`*",I
  1293. XM:&5A9"YS>7,Z<')O=&]S=RYH"3$N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N
  1294. XM-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H(RDO=7-R+W-R8R]U
  1295. XM=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N,"`P-2\R,B\Y,"`W
  1296. XM,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?<WES=&TN:`DQ+C$N,RXQ
  1297. XM`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N,0!`*",I:V5R;BUN970Z
  1298. XM868N:`DQ+C$N,RXQ`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C
  1299. XM*6ME<FXM:6YE=#II<%]S='(N:`DQ+C$N,RXQ`&%C;VUP.B`H4T-$12D@-2XP
  1300. XM("`P-"\Q.2\Y,`!O<'1I;3H@*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A3
  1301. XM0T1%*2`U+C`@(#`T+S$Y+SDP`$`H(REK97)N+6EN970Z:6Y?8VMS=6TN8PDQ
  1302. XM+C,`0"@C*6AE860N<WES.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z
  1303. XM<V5L96-T+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT+C$S
  1304. XM+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS>7,Z
  1305. XM=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ`$`H
  1306. XM(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z8W)E
  1307. XM9"YH"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C*2]U
  1308. XM<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP(#`U
  1309. XM+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6AE860N<WES.F-M;E]E<G(N:`DQ
  1310. XM+C,N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O<'1I;3H@*%-#
  1311. XM1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`$`H
  1312. XM(REK97)N+6EN970Z:6Y?<&-B+F,),2XS`$`H(REH96%D+G-Y<SIT>7!E<RYH
  1313. XM"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C*6AE
  1314. XM860N<WES.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O<S5P87)A
  1315. XM;2YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-Y<W1M+F@),2XS+C$P+C$`0"@C
  1316. XM*6AE860N<WES.G-T<F5A;2YH"3$N-"XQ,RXQ`$`H(REH96%D+G-Y<SIV;F]D
  1317. XM92YH"3$N,2XW+C$`0"@C*6AE860N<WES.G1I;64N:`DQ+C$N,RXQ`$`H(REH
  1318. XM96%D+G-Y<SIP;VQL+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R;61E<"YH
  1319. XM"3$N,2XQ+C$`0"@C*6AE860N<WES.F-R960N:`DQ+C$N,BXQ`$`H(REH96%D
  1320. XM+G-Y<SIS=')L;V<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIL;V<N:`DQ+C,N
  1321. XM-"XQ`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES
  1322. XM.G1I:&1R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z=&EU<V5R+F@),2XS+C0N
  1323. XM,@!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:&5A9"YS>7,Z
  1324. XM<V]C:V5T=F%R+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z<V]C:VEO+F@),2XQ
  1325. XM+C$N,0!`*",I:&5A9"YS>7,Z:6]C8V]M+F@),2XQ+C$N,0!`*",I:V5R;BUN
  1326. XM970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H
  1327. XM(RDO=7-R+W-R8R]U=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N
  1328. XM,"`P-2\R,B\Y,"`W,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?<WES
  1329. XM=&TN:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N,0!`
  1330. XM*",I:V5R;BUN970Z<F]U=&4N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?
  1331. XM<&-B+F@),2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP+F@),2XQ+C(N,0!`*",I
  1332. XM:V5R;BUI;F5T.FEP7W9A<BYH"3$N,2XS+C$`0"@C*6AE860N<WES.G!R;W1O
  1333. XM<W<N:`DQ+C$`0"@C*6ME<FXM:6YE=#II<%]S='(N:`DQ+C$N,RXQ`$`H(REK
  1334. XM97)N+6EN970Z:6YS<F5M+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z:VUE;2YH
  1335. XM"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H
  1336. XM4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``
  1337. XM0"@C*6ME<FXM:6YE=#II;E]S=VET8V@N8PDQ+C,`0"@C*6AE860N<WES.G1Y
  1338. XM<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ+C$N,0!`
  1339. XM*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIF<R]S
  1340. XM-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<WES=&TN:`DQ+C,N,3`N
  1341. XM,0!`*",I:&5A9"YS>7,Z<VEG;F%L+F@),2XS+C@N,0!`*",I:&5A9"YS>7,Z
  1342. XM8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.G!R;V,N:`DQ+C,N,3,N,0!`
  1343. XM*",I:&5A9"YS>7,Z:6UM=2YH"3$N-BXY+C$`0"@C*6AE860N<WES.G5S97(N
  1344. XM:`DQ+C4N,34N,@!`*",I:&5A9"YS>7,Z<VEG:6YF;RYH"3$N,2XT+C$`0"@C
  1345. XM*6AE860N<WES.G1S<RYH"3$N-"XQ+C$`0"@C*6AE860N<WES.G-E9RYH"3$N
  1346. XM-2XS+C$`0"@C*6AE860N<WES.G)E<V]U<F-E+F@),2XQ+C0N,0!`*",I:&5A
  1347. XM9"YS>7,Z97AE8RYH"3$N,2XY+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ
  1348. XM+C<N,0!`*",I:&5A9"YS>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES
  1349. XM.FEO8W1L+F@),2XS+C<N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ
  1350. XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
  1351. XM<W1R96%M+F@),2XT+C$S+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ
  1352. XM`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z
  1353. XM<W1R;W!T<RYH"3$N-"XU+C$`0"@C*6AE860N<WES.F-O;F8N:`DQ+C,N-RXR
  1354. XM`$`H(REH96%D+G-Y<SIE=F5C8BYH"3$N,2XQ+C$`0"@C*6AE860N<WES.G-T
  1355. XM<FQO9RYH"3$N,RXT+C$`0"@C*6AE860N<WES.FQO9RYH"3$N,RXT+C$`0"@C
  1356. XM*6AE860N<WES.F1E8G5G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z<')O=&]S
  1357. XM=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:V5R
  1358. XM;BUI;F5T.FEN+F@),2XQ+C0N,0!`*",I+W5S<B]S<F,O=71S+VDS.#8O<WES
  1359. XM+V)Y=&5O<F1E<BYH+G-L(#$N,2`T+C`@,#4O,C(O.3`@-S$P,2!!5"94+553
  1360. XM3`!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE=#IA9BYH
  1361. XM"3$N,2XS+C$`0"@C*6ME<FXM;F5T.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R
  1362. XM;BUI;F5T.FEN7W9A<BYH"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II<%]S='(N
  1363. XM:`DQ+C$N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O<'1I;3H@
  1364. XM*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T+S$Y+SDP
  1365. XM`$`H(REK97)N+6EN970Z:6Y?=')A;G-P+F,),2XS`$`H(REH96%D+G-Y<SIT
  1366. XM>7!E<RYH"3$N-2XX+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`
  1367. XM0"@C*6AE860N<WES.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O
  1368. XM<S5P87)A;2YH"3$N,RXR+C$`0"@C*6AE860N<WES.G1I;64N:`DQ+C$N,RXQ
  1369. XM`$`H(REH96%D+G-Y<SIS>7-M86-R;W,N:`DQ+C,N-BXQ`$`H(REH96%D+G-Y
  1370. XM<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.G-T<F]P=',N:`DQ+C0N
  1371. XM-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`*",I:&5A9"YS>7,Z
  1372. XM979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')E86TN:`DQ+C0N,3,N
  1373. XM,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N-RXQ`$`H(REH96%D+G-Y<SIP
  1374. XM;VQL+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R;61E<"YH"3$N,2XQ+C$`
  1375. XM0"@C*6AE860N<WES.F-R960N:`DQ+C$N,BXQ`$`H(REH96%D+G-Y<SIS=')L
  1376. XM;V<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIL;V<N:`DQ+C,N-"XQ`$`H(REK
  1377. XM97)N+6EN970Z;FEH9'(N:`DQ+C$N,BXQ`$`H(REH96%D+G-Y<SID;'!I+F@)
  1378. XM,2XQ+C,N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`*",I:&5A
  1379. XM9"YS>7,Z<V]C:VEO+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z:6]C8V]M+F@)
  1380. XM,2XQ+C$N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE
  1381. XM=#IS=')I;V,N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ
  1382. XM`$`H(RDO=7-R+W-R8R]U=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ
  1383. XM(#0N,"`P-2\R,B\Y,"`W,3`Q($%4)E0M55-,`$`H(REK97)N+6EN970Z:6Y?
  1384. XM=F%R+F@),2XQ+C(N,0!`*",I:V5R;BUN970Z<F]U=&4N:`DQ+C$N,RXQ`$`H
  1385. XM(REK97)N+6EN970Z:7!?<W1R+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEP
  1386. XM7W9A<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ
  1387. XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
  1388. XM:VUE;2YH"3$N,2XS+C$`0"@C*6AE860N<WES.G1I;6]D+F@),2XS+C0N,0!A
  1389. XM8V]M<#H@*%-#1$4I(#4N,"`@,#0O,3DO.3``;W!T:6TZ("A30T1%*2`U+C`@
  1390. XM(#`T+S$Y+SDP`&%S.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!`*",I:V5R;BUI
  1391. XM;F5T.FEP7VEN<'5T+F,),2XS`$`H(REH96%D+G-Y<SIT>7!E<RYH"3$N-2XX
  1392. XM+C$`0"@C*6AE860N<WES.G-E;&5C="YH"3$N,2XQ+C$`0"@C*6AE860N<WES
  1393. XM.G!A<F%M+F@),2XS+C@N,@!`*",I:&5A9"YS>7,Z9G,O<S5P87)A;2YH"3$N
  1394. XM,RXR+C$`0"@C*6AE860N<WES.G-Y<W1M+F@),2XS+C$P+C$`0"@C*6AE860N
  1395. XM<WES.G-T<F]P=',N:`DQ+C0N-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS
  1396. XM+C<N,@!`*",I:&5A9"YS>7,Z979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
  1397. XM<SIS=')E86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ+C$N
  1398. XM-RXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z
  1399. XM<&]L;"YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ
  1400. XM`$`H(REH96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<W1R
  1401. XM;&]G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z;&]G+F@),2XS+C0N,0!`*",I
  1402. XM:&5A9"YS>7,Z<')O=&]S=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@)
  1403. XM,2XQ+C0N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ`$`H(REH96%D
  1404. XM+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N
  1405. XM-"XQ`$`H(REK97)N+6EN970Z:6XN:`DQ+C$N-"XQ`$`H(RDO=7-R+W-R8R]U
  1406. XM=',O:3,X-B]S>7,O8GET96]R9&5R+F@N<VP@,2XQ(#0N,"`P-2\R,B\Y,"`W
  1407. XM,3`Q($%4)E0M55-,`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C
  1408. XM*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ`$`H(REK97)N+6EN970Z:6Y?
  1409. XM<WES=&TN:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:6Y?=F%R+F@),2XQ+C(N
  1410. XM,0!`*",I:V5R;BUI;F5T.FEP+F@),2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP
  1411. XM7W9A<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<%]I8VUP+F@),2XQ+C(N
  1412. XM,0!`*",I:V5R;BUI;F5T.FEP7W-T<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE
  1413. XM=#IT8W`N:`DQ+C$N,BXQ`$`H(REK97)N+6EN970Z:6YS<F5M+F@),2XQ+C,N
  1414. XM,0!`*",I:V5R;BUI;F5T.FYI:&1R+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z
  1415. XM:VUE;2YH"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P
  1416. XM=&EM.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O
  1417. XM,3DO.3``0"@C*6ME<FXM:6YE=#II<%]O=71P=70N8PDQ+C,`0"@C*6AE860N
  1418. XM<WES.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ
  1419. XM+C$N,0!`*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y
  1420. XM<SIF<R]S-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@)
  1421. XM,2XT+C$S+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A
  1422. XM9"YS>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N
  1423. XM,BXQ`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS
  1424. XM>7,Z8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.G-T<F]P=',N:`DQ+C0N
  1425. XM-2XQ`$`H(REH96%D+G-Y<SIC;VYF+F@),2XS+C<N,@!`*",I:&5A9"YS>7,Z
  1426. XM979E8V(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIS=')L;V<N:`DQ+C,N-"XQ
  1427. XM`$`H(REH96%D+G-Y<SIE<G)N;RYH"3$N,RXX+C$`0"@C*6AE860N<WES.F-M
  1428. XM;E]E<G(N:`DQ+C,N,RXQ`$`H(REH96%D+G-Y<SIS;V-K970N:`DQ+C$N-"XQ
  1429. XM`$`H(REH96%D+G-Y<SIS;V-K971V87(N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
  1430. XM<SIP<F]T;W-W+F@),2XQ`$`H(REK97)N+6YE=#II9BYH"3$N,2XT+C$`0"@C
  1431. XM*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C*2]U<W(O<W)C+W5T<R]I,S@V
  1432. XM+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP(#`U+S(R+SDP(#<Q,#$@050F
  1433. XM5"U54TP`0"@C*6ME<FXM:6YE=#II;E]V87(N:`DQ+C$N,BXQ`$`H(REK97)N
  1434. XM+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;E]S>7-T;2YH
  1435. XM"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<"YH"3$N,2XR+C$`0"@C*6ME<FXM
  1436. XM:6YE=#II<%]V87(N:`DQ+C$N,RXQ`$`H(REK97)N+6EN970Z:7!?:6-M<"YH
  1437. XM"3$N,2XR+C$`0"@C*6ME<FXM:6YE=#II;E]P8V(N:`DQ+C$N,BXQ`$`H(REH
  1438. XM96%D+G-Y<SID;'!I+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FYI:&1R+F@)
  1439. XM,2XQ+C(N,0!`*",I:V5R;BUI;F5T.FEP7W-T<BYH"3$N,2XS+C$`86-O;7`Z
  1440. XM("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H4T-$12D@-2XP("`P-"\Q
  1441. XM.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``0"@C*6ME<FXM:6YE=#II
  1442. XM<%]M86EN+F,),2XS+C$N,0!`*",I:&5A9"YS>7,Z='EP97,N:`DQ+C4N."XQ
  1443. XM`$`H(REH96%D+G-Y<SIS96QE8W0N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIP
  1444. XM87)A;2YH"3$N,RXX+C(`0"@C*6AE860N<WES.F9S+W,U<&%R86TN:`DQ+C,N
  1445. XM,BXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS>7,Z
  1446. XM<WES;6%C<F]S+F@),2XS+C8N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N
  1447. XM."XQ`$`H(REH96%D+G-Y<SIS=')O<'1S+F@),2XT+C4N,0!`*",I:&5A9"YS
  1448. XM>7,Z8V]N9BYH"3$N,RXW+C(`0"@C*6AE860N<WES.F5V96-B+F@),2XQ+C$N
  1449. XM,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT+C$S+C$`0"@C*6AE860N<WES
  1450. XM.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS>7,Z<&]L;"YH"3$N,RXR+C$`
  1451. XM0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y<SIC
  1452. XM<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z<W1R;&]G+F@),2XS+C0N,0!`
  1453. XM*",I:&5A9"YS>7,Z;&]G+F@),2XS+C0N,0!`*",I:V5R;BUI;F5T.FYI:&1R
  1454. XM+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z9&QP:2YH"3$N,2XS+C$`0"@C*6AE
  1455. XM860N<WES.G-O8VME="YH"3$N,2XT+C$`0"@C*6AE860N<WES.G-O8VMI;RYH
  1456. XM"3$N,2XQ+C$`0"@C*6AE860N<WES.FEO8V-O;2YH"3$N,2XQ+C$`0"@C*6ME
  1457. XM<FXM;F5T.FEF+F@),2XQ+C0N,0!`*",I:V5R;BUN970Z<W1R:6]C+F@),2XQ
  1458. XM+C,N,0!`*",I:V5R;BUI;F5T.FEN+F@),2XQ+C0N,0!`*",I+W5S<B]S<F,O
  1459. XM=71S+VDS.#8O<WES+V)Y=&5O<F1E<BYH+G-L(#$N,2`T+C`@,#4O,C(O.3`@
  1460. XM-S$P,2!!5"94+5533`!`*",I:V5R;BUI;F5T.FEN7W9A<BYH"3$N,2XR+C$`
  1461. XM0"@C*6ME<FXM;F5T.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEP
  1462. XM7W-T<BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II<%]V87(N:`DQ+C$N,RXQ
  1463. XM`$`H(REH96%D+G-Y<SIC;6Y?97)R+F@),2XS+C,N,0!`*",I:&5A9"YS>7,Z
  1464. XM:VUE;2YH"3$N,2XS+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P
  1465. XM=&EM.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O
  1466. XM,3DO.3``0"@C*6ME<FXM:6YE=#IN971L:6(N8PDQ+C,`0"@C*6AE860N<WES
  1467. XM.G1Y<&5S+F@),2XU+C@N,0!`*",I:&5A9"YS>7,Z<V5L96-T+F@),2XQ+C$N
  1468. XM,0!`*",I:&5A9"YS>7,Z<&%R86TN:`DQ+C,N."XR`$`H(REH96%D+G-Y<SIF
  1469. XM<R]S-7!A<F%M+F@),2XS+C(N,0!`*",I:&5A9"YS>7,Z<W1R96%M+F@),2XT
  1470. XM+C$S+C$`0"@C*6AE860N<WES.G9N;V1E+F@),2XQ+C<N,0!`*",I:&5A9"YS
  1471. XM>7,Z=&EM92YH"3$N,2XS+C$`0"@C*6AE860N<WES.G!O;&PN:`DQ+C,N,BXQ
  1472. XM`$`H(REH96%D+G-Y<SIS=')M9&5P+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z
  1473. XM8W)E9"YH"3$N,2XR+C$`0"@C*6AE860N<WES.F5R<FYO+F@),2XS+C@N,0!`
  1474. XM*",I:&5A9"YS>7,Z<WES;6%C<F]S+F@),2XS+C8N,0!`*",I:&5A9"YS>7,Z
  1475. XM9&5B=6<N:`DQ+C,N-"XQ`$`H(REH96%D+G-Y<SIS:6=N86PN:`DQ+C,N."XQ
  1476. XM`$`H(REH96%D+G-Y<SIP<F]C+F@),2XS+C$S+C$`0"@C*6AE860N<WES.FEM
  1477. XM;74N:`DQ+C8N.2XQ`$`H(REH96%D+G-Y<SIU<V5R+F@),2XU+C$U+C(`0"@C
  1478. XM*6AE860N<WES.G-I9VEN9F\N:`DQ+C$N-"XQ`$`H(REH96%D+G-Y<SIT<W,N
  1479. XM:`DQ+C0N,2XQ`$`H(REH96%D+G-Y<SIS96<N:`DQ+C4N,RXQ`$`H(REH96%D
  1480. XM+G-Y<SIR97-O=7)C92YH"3$N,2XT+C$`0"@C*6AE860N<WES.F5X96,N:`DQ
  1481. XM+C$N.2XQ`$`H(REH96%D+G-Y<SIT:6AD<BYH"3$N,RXS+C$`0"@C*6AE860N
  1482. XM<WES.G1I=7-E<BYH"3$N,RXT+C(`0"@C*6AE860N<WES.G-O8VME="YH"3$N
  1483. XM,2XT+C$`0"@C*6ME<FXM;F5T.G-T<FEO8RYH"3$N,2XS+C$`0"@C*6AE860N
  1484. XM<WES.G-O8VME='9A<BYH"3$N,2XQ+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N
  1485. XM,2XT+C$`0"@C*2]U<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS
  1486. XM;"`Q+C$@-"XP(#`U+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6ME<FXM;F5T
  1487. XM.G)O=71E+F@),2XQ+C,N,0!`*",I:V5R;BUI;F5T.FEN7W!C8BYH"3$N,2XR
  1488. XM+C$`86-O;7`Z("A30T1%*2`U+C`@(#`T+S$Y+SDP`&]P=&EM.B`H4T-$12D@
  1489. XM-2XP("`P-"\Q.2\Y,`!A<SH@*%-#1$4I(#4N,"`@,#0O,3DO.3``0"@C*6ME
  1490. XM<FXM:6YE=#IR;W5T92YC"3$N,P!`*",I:&5A9"YS>7,Z='EP97,N:`DQ+C4N
  1491. XM."XQ`$`H(REH96%D+G-Y<SIS96QE8W0N:`DQ+C$N,2XQ`$`H(REH96%D+G-Y
  1492. XM<SIP87)A;2YH"3$N,RXX+C(`0"@C*6AE860N<WES.F9S+W,U<&%R86TN:`DQ
  1493. XM+C,N,BXQ`$`H(REH96%D+G-Y<SIS>7-T;2YH"3$N,RXQ,"XQ`$`H(REH96%D
  1494. XM+G-Y<SIS=')E86TN:`DQ+C0N,3,N,0!`*",I:&5A9"YS>7,Z=FYO9&4N:`DQ
  1495. XM+C$N-RXQ`$`H(REH96%D+G-Y<SIT:6UE+F@),2XQ+C,N,0!`*",I:&5A9"YS
  1496. XM>7,Z<&]L;"YH"3$N,RXR+C$`0"@C*6AE860N<WES.G-T<FUD97`N:`DQ+C$N
  1497. XM,2XQ`$`H(REH96%D+G-Y<SIC<F5D+F@),2XQ+C(N,0!`*",I:&5A9"YS>7,Z
  1498. XM<')O=&]S=RYH"3$N,0!`*",I:&5A9"YS>7,Z<V]C:V5T+F@),2XQ+C0N,0!`
  1499. XM*",I:&5A9"YS>7,Z<V]C:VEO+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z:6]C
  1500. XM8V]M+F@),2XQ+C$N,0!`*",I:&5A9"YS>7,Z97)R;F\N:`DQ+C,N."XQ`$`H
  1501. XM(REH96%D+G-Y<SIS=')O<'1S+F@),2XT+C4N,0!`*",I:&5A9"YS>7,Z8V]N
  1502. XM9BYH"3$N,RXW+C(`0"@C*6AE860N<WES.F5V96-B+F@),2XQ+C$N,0!`*",I
  1503. XM:&5A9"YS>7,Z<W1R;&]G+F@),2XS+C0N,0!`*",I:&5A9"YS>7,Z;&]G+F@)
  1504. XM,2XS+C0N,0!`*",I:V5R;BUN970Z:68N:`DQ+C$N-"XQ`$`H(REK97)N+6YE
  1505. XM=#IA9BYH"3$N,2XS+C$`0"@C*6ME<FXM:6YE=#II;BYH"3$N,2XT+C$`0"@C
  1506. XM*2]U<W(O<W)C+W5T<R]I,S@V+W-Y<R]B>71E;W)D97(N:"YS;"`Q+C$@-"XP
  1507. XM(#`U+S(R+SDP(#<Q,#$@050F5"U54TP`0"@C*6ME<FXM:6YE=#II;E]V87(N
  1508. XM:`DQ+C$N,BXQ`$`H(REK97)N+6YE=#IR;W5T92YH"3$N,2XS+C$`0"@C*6AE
  1509. XM860N<WES.F-M;E]E<G(N:`DQ+C,N,RXQ`$`H(REK97)N+6EN970Z:7!?<W1R
  1510. XM+F@),2XQ+C,N,0!A8V]M<#H@*%-#1$4I(#4N,"`@,#0O,3DO.3``;W!T:6TZ
  1511. XM("A30T1%*2`U+C`@(#`T+S$Y+SDP`&%S.B`H4T-$12D@-2XP("`P-"\Q.2\Y
  1512. XM,`!`*",I:V5R;BUI;F5T.FEP7W9E<G,N8PDQ+C,`0"@C*6AE860N<WES.F-M
  1513. XM;E]E<G(N:`DQ+C,N,RXQ`&%C;VUP.B`H4T-$12D@-2XP("`P-"\Q.2\Y,`!O
  1514. XM<'1I;3H@*%-#1$4I(#4N,"`@,#0O,3DO.3``87,Z("A30T1%*2`U+C`@(#`T
  1515. XM+S$Y+SDP````````````````````````````````````````````````````
  1516. XM```````!`````0````8`````````-````!!F``````````````0`````````
  1517. XM!P````$````"`````````$1F```\```````````````$``````````\````!
  1518. XM`````P````````"`9@``*`(`````````````!``````````5`````0````,`
  1519. XM````````J&@``.P$``````````````0`````````'`````@````#````````
  1520. XM`)1M``"H```````````````$`````````"$````"``````````````"4;0``
  1521. XM,`X```<````E````!````!`````I`````P``````````````Q'L``"((````
  1522. XM``````````$`````````,0````,``````````````.:#``!D````````````
  1523. XM```!`````````#L````)``````````````!,A```:!4```8````!````!```
  1524. XM``@```!%````"0``````````````M)D``'@````&`````@````0````(````
  1525. XM40````D``````````````"R:```@`0``!@````,````$````"````%L````!
  1526. XC``````````````!,FP``02D``````````````0``````````
  1527. X`
  1528. Xend
  1529. END_OF_FILE
  1530.   if test 20206 -ne `wc -c <'driver/v2.ip.fix/Driver.UU.02'`; then
  1531.     echo shar: \"'driver/v2.ip.fix/Driver.UU.02'\" unpacked with wrong size!
  1532.   fi
  1533.   # end of 'driver/v2.ip.fix/Driver.UU.02'
  1534. fi
  1535. if test ! -d 'man' ; then
  1536.     echo shar: Creating directory \"'man'\"
  1537.     mkdir 'man'
  1538. fi
  1539. if test ! -d 'man/man1' ; then
  1540.     echo shar: Creating directory \"'man/man1'\"
  1541.     mkdir 'man/man1'
  1542. fi
  1543. if test ! -d 'man/man7' ; then
  1544.     echo shar: Creating directory \"'man/man7'\"
  1545.     mkdir 'man/man7'
  1546. fi
  1547. if test ! -d 'utils' ; then
  1548.     echo shar: Creating directory \"'utils'\"
  1549.     mkdir 'utils'
  1550. fi
  1551. echo shar: End of archive 1 \(of 4\).
  1552. cp /dev/null ark1isdone
  1553. MISSING=""
  1554. for I in 1 2 3 4 ; do
  1555.     if test ! -f ark${I}isdone ; then
  1556.     MISSING="${MISSING} ${I}"
  1557.     fi
  1558. done
  1559. if test "${MISSING}" = "" ; then
  1560.     echo You have unpacked all 4 archives.
  1561.     rm -f ark[1-9]isdone
  1562. else
  1563.     echo You still must unpack the following archives:
  1564.     echo "        " ${MISSING}
  1565. fi
  1566. exit 0
  1567. exit 0 # Just in case...
  1568.